package com.liuhousemyjavabasic.StringDo;
import org.junit.Test;

import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.Locale;

/**
 * Java String类
 * https://www.w3cschool.cn/java/java-string.html
 */
public class StringOne {

    @Test
    public void testString01(){
        //字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串
        //创建一个字符串的最简单的方式
        String greeting = "Hello world";
        System.out.println(greeting);

        //创建字符串的第二种方式  char[] 不要导错包
        char[] helloArray = { 'h', 'e', 'l', 'l', 'o', '.'};
        String helloString = new String(helloArray);
        System.out.println( helloString );

        //需要注意的是 String类是不可变的,所以一旦创建了String对象,那么他的值就没有办法改变了
        //如果想要对字符串进行修改,那么应该选择使用StringBuffer & StringBuilder类

        //字符串长度
        String palindrome = "Dot saw I was Tod";
        int len = palindrome.length();
        System.out.println("String Length is : " + len);


        //连接字符串
        //concat() 连接字符串1
        String names_info = "My name is".concat("Liuhouse");
        System.out.println(names_info);

        //使用 + 连接字符串 学到哪里是哪里  不需要太多扩展 只需要学好当下的即可 适当扩展
        String names_info2 = "Hello" + "java" + "!";
        System.out.println(names_info2);

        String names3 = liuhouse_concat(liuhouse_concat("Liu" , "Hello") , "Success");
        System.out.println(names3);

        Float floatVar = 12F;
        Integer INTvAR = 20;
        String stringVar = "yes";
        //创建格式化字符串
        System.out.printf("The value of the float variable is" +
                "%f , while the value of the integer" +
                "variable is %d , and string" +
                "is %s" , floatVar , INTvAR , stringVar);
        System.out.println("--------");

        //第二种方法
        String fs;
        fs = String.format("The value of the float variable is" +
                "%f , while the value of the integer" +
                "variable is %d , and string" +
                "is %s" , floatVar , INTvAR , stringVar);
        System.out.println(fs);

    }


    //我之前说过  这些方法 没有理解 就是人设计的 只要你基础扎实 你也可以  所以  试试
    //封装一个方法 用于字符串的拼接
    public static String liuhouse_concat(String str1 , String str2){
        return str1 + str2;
    }


    /**
     * 字符串常用的方法
     *
     */
    @Test
    public void testNormalFun(){
        String s = "www.w3cschool.cn";
        char result = s.charAt(8);
        System.out.println(result);

        String str1 = "Strings";
        String str2 = "Strings";
        String str3 = "Strings123";

        int res1 = str1.compareTo(str2);
        System.out.println(res1);//0
        int res2 = str2.compareTo(str3);
        System.out.println(res2);//-3
        int res3 = str3.compareTo(str1);
        System.out.println(res3);//3

        //按照字典顺序比较两个字符串,不考虑大小写
        String string4 = "STRINGS";
        String string5 = "Strings";
        String string6 = "Strings123";

        int res4 = string4.compareToIgnoreCase(string5);
        //结果显示 两个都是一样的
        System.out.println(res4);//0

        int res5 = string5.compareToIgnoreCase(string6);
        System.out.println(res5);//-3

        int res6 = string6.compareToIgnoreCase(string4);
        System.out.println(res6);

    }


    @Test
    public void testConcat(){
        //将指定的字符串参数连接到字符串上
        String s = "W3Cschool教程";
        s = s.concat("www.w3cschool.cn");
        System.out.println(s);


        //contentEquals()方法用于将此字符串与指定的StringBuffer比较
        String str1 = "String1";
        String str2 = "String2";
        StringBuffer str3 = new StringBuffer("String1");

        boolean result1 = str1.contentEquals(str3);
        System.out.println(result1);

        boolean result2 = str2.contentEquals(str3);
        System.out.println(result2);
    }



    @Test
    public void testCopyValueOf(){
        char[] Str1 = {'h', 'e', 'l', 'l', 'o', ' ', 'w', '3', 'c', 's', 'c', 'h' , 'o' , 'o' , 'l'};
        String Str2 = "";
        String Str3 = "";
        Str2 = Str2.copyValueOf(Str1);
        System.out.println("返回的结果 : " + Str2);

        Str3 = Str3.copyValueOf(Str1 , 2 , 6);
        System.out.println(Str3);

    }


    @Test
    public void testEndsWiht(){
        //endsWith()方法用于测试字符串是否以指定的后缀结束
        String Str = new String("W3CSchool教程:www.w3cschool.cn");
        boolean retVal;
        retVal = Str.endsWith("youj");
        System.out.println("返回值= " + retVal);


        retVal = Str.endsWith("cn");
        System.out.println("返回值= " + retVal);
    }


    @Test
    public void testEquals(){
        String Str1 = new String("youj");
        String Str2 = Str1;
        String Str3 = new String("youj");
        boolean retVal;
        retVal = Str1.equals(Str2);
        System.out.println("返回值 = " + retVal);

        retVal = Str1.equals(Str3);
        System.out.println("返回值 = " + retVal);
    }


    @Test
    public void testEqualsIgnoreCase(){
        //EqualsIgnoreCase()方法用于将字符串与指定对象比较,不考虑大小写
        String Str1 = new String("w3cschool");
        String Str2 = Str1;
        String Str3 = new String("W3CSCHOOL");
        String Str4 = new String("W3Cschool");
        boolean retVal;

        retVal = Str1.equals(Str2);
        System.out.println(retVal);

        retVal = Str3.equals(Str4);
        System.out.println(retVal);

        retVal = Str1.equalsIgnoreCase(Str4);
        System.out.println(retVal);
    }


    @Test
    public void testBytes(){
        String Str1 = new String("youj");
        byte[] Str2 = Str1.getBytes();
        System.out.println("返回值:" + Str2);//[B@68fb2c38

        try {
            Str2 = Str1.getBytes("UTF-8");//[B@567d299b
            System.out.println(Str2);

            Str2 = Str1.getBytes("ISO-8859-1");//[B@2eafffde
            System.out.println("返回值:" + Str2);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

    }

    @Test
    public void getChars(){
        //将字符从字符串复制到目标字符数组
        String Str1 = new String("www.runoob.com");
        char[] newChar = new char[Str1.length()];
        //拷贝字符串
        Str1.getChars(0 , Str1.length() , newChar ,0);
        System.out.println(newChar);

    }


    @Test
    public void testHashCode(){
        String str = new String("www.w3cschool.cn");
        System.out.println("字符串的哈希码为:" + str.hashCode());
    }


    @Test
    public void testIndexOf(){
        String Str = new String("W3Cschool教程:www.w3cschool.cn");
        String SubStr1 = new String("youj");
        String SubStr2 = new String("com");

        System.out.println("查找字符串 o 第一次出现的位置:");
        System.out.println(Str.indexOf('o'));
        System.out.println("从第14个位置查找字符 o 第一次出现的位置 :");
        System.out.println(Str.indexOf("o" , 14));

        System.out.print("子字符串 SubStr1 第一次出现的位置:" );
        System.out.println(Str.indexOf(SubStr1));

        System.out.print("从第十五个位置开始搜索子字符串 SubStr1 第一次出现的位置 :" );
        System.out.println(Str.indexOf(SubStr1 , 15));

        System.out.println("子字符串SubStr2第一次出现的位置:");
        System.out.println(Str.indexOf(SubStr2));

    }



    @Test
    public void testIntern(){
        //intern() 方法返回字符串对象的规范化表示形式。
        String Str1 = new String("www.w3cschool.cn");
        String Str2 = new String("www.w3cschool.cn");
        System.out.println("规范表示:");
        System.out.println(Str1.intern());
        System.out.println(Str2.intern());
    }


    @Test
    public void testLastIndexOf(){
        String Str = new String("W3Cschool教程:www.w3cschool.cn");
        String SubStr1 = new String("youj");
        String SubStr2 = new String("com");

        System.out.print("查找字符 o 最后出现的位置 :" );
        System.out.println(Str.lastIndexOf("o"));
        System.out.print("从第14个位置查找字符 o 最后出现的位置 :" );
        System.out.println(Str.lastIndexOf("o" , 14));
        System.out.print("子字符串 SubStr1 最后出现的位置:" );
        System.out.println(Str.lastIndexOf(SubStr1));
        System.out.print("从第十五个位置开始搜索子字符串 SubStr1最后出现的位置 :" );
        System.out.println(Str.lastIndexOf(SubStr1 , 15));
        System.out.print("子字符串 SubStr2 最后出现的位置 :" );
        System.out.println(Str.lastIndexOf(SubStr2));
    }



    @Test
    public void testLength(){
        String Str1 = new String("www.w3cschool.cn");
        String Str2 = new String("youj");
        System.out.println("字符串1的长度是" + Str1.length());
        System.out.println("字符串2的长度是" + Str2.length());
    }

    //Java matches() 方法
    @Test
    public void testMatchs(){
        String Str = new String("www.w3cschool.cn");
        System.out.println("返回值:");
        System.out.println(Str.matches("(.*)youj(.*)"));
        System.out.println("返回值:");
        System.out.println(Str.matches("(.*)google(.*)"));
        System.out.println("返回值:");
        System.out.println(Str.matches("www(.*)"));

    }

    //regionMatches() 方法用于检测两个字符串在一个区域内是否相等
    @Test
    public void testRegionMatches(){
        String Str1 = new String("www.w3cschool.cn");
        String Str2 = new String("w3cschool");
        String Str3 = new String("W3Cschool");
        System.out.println("value:");
        System.out.println(Str1.regionMatches(4 , Str2 , 0 , 5));
        System.out.println("value:");
        System.out.println(Str1.regionMatches(4 , Str3 , 0 , 5));
        System.out.println("value:");
    }



    //replace() 方法通过用 newChar
    //字符替换字符串中出现的所有 oldChar 字符，并返回替换后的新字符串。
    @Test
    public void testReplace(){
        String Str = new String("hello");
        System.out.println("返回值:");
        System.out.println(Str.replace('o' , 'T'));

        System.out.println("返回值:");
        System.out.println(Str.replace('l' , 'D'));
    }


    @Test
    public void testReplaceAll(){
        //replaceAll()方法使用给定的参数 replacement 替换字符串所有匹配
        //给定的正则表达式字符串
        String Str = new String("www.google.com");
        System.out.println("匹配成功的返回值:");
        System.out.println(Str.replaceAll("(.*)google(.*)" , "youj"));
        System.out.println("匹配失败返回值:");
        System.out.println(Str.replaceAll("(.*)taobao(.*)" , "youj"));
    }

    //replaceFirst() 方法使用给定的参数
    //replacement 替换字符串第一个匹配给定的正则表达式的子字符串。
    @Test
    public void testReplaceFirst(){
        //成功返回替换的字符串,失败返回原始字符串
        String Str = new String("hello youj，I am from youj。");
        System.out.println("返回值:");
        System.out.println(Str.replaceFirst("youj" , "google"));
    }


    @Test
    public void testSplit(){
        //split() 方法根据匹配给定的正则表达式来拆分字符串。
        String Str = new String("Welcome-to-W3CSchool.com");
        System.out.println("返回值:");
        for (String retval : Str.split("-")){
            System.out.println(retval);
        }
        System.out.println("");
        System.out.println("返回值:");
        for (String retval : Str.split("-" , 3)){
            System.out.println(retval);
        }


        System.out.println("");
        System.out.println("返回值:");
        for (String retval : Str.split("-" , 0)){
            System.out.println(retval);
        }

        System.out.println("");
        System.out.println("返回值 :" );
        for (String retval: Str.split("-")){
            System.out.println(retval);
        }
    }


    @Test
    public void testStartsWith(){
        //startsWith() 方法用于检测字符串是否以指定的前缀开始。
        String Str = new String("www.w3cschool.cn");
        //对于注释就那样
        System.out.println("返回值:");
        System.out.println(Str.startsWith("www"));//true

        System.out.println("返回值:");
        System.out.println(Str.startsWith("w3cschool"));

        System.out.println("返回值:");
        System.out.println(Str.startsWith("w3cschool" , 4));
    }


    @Test
    public void subSequence(){
        //subSequence方法返回一个新的字符序列，它是此序列的一个子序列。
        String Str = new String("www.w3cschool.cn");
        System.out.println("返回值:");
        System.out.println(Str.subSequence(4 , 10));
    }

    @Test
    public void subString(){
        //substring() 方法返回字符串的子字符串。可以理解为字符串切片【python的概念】。
        String Str = new String("www.w3cschool.cn");
        System.out.println("返回值:");
        System.out.println(Str.substring(4));
        System.out.println("返回值:");
        System.out.println(Str.substring(4 , 13));
    }


    @Test
    public void testToCharArray(){
        //toCharArray() 方法将字符串转换为字符数组。
        String Str = new String("www.w3cschool.cn");
        System.out.println("返回值:");
        System.out.println(Str.toCharArray());
        char[] chars = Str.toCharArray();
        System.out.println(chars.getClass().getTypeName());
    }



    @Test
    public void testToLowerCase(){
        String s = new String("wwW.w3cschool.cn");
        System.out.println("返回值:");
        System.out.println(s.toLowerCase(Locale.ROOT));
    }


    @Test
    public void testToString(){
        //toString() 方法返回此对象本身（它已经是一个字符串）。
        String s = new String("www.w3cschool.cn");
        System.out.println("返回值:");
        System.out.println(s.toString());
    }


    @Test
    public void toUpperCase(){
        //toUpperCase() 方法将字符串小写字符转换为大写。
        String Str = new String("www.w3cschool.cn");
        System.out.println("返回值:");
        System.out.println(Str.toUpperCase(Locale.ROOT));
    }

    @Test
    public void testTrim(){
        //trim() 方法用于删除字符串的头尾空白符。
        String str = new String("    www.w3cschool.cn    ");
        System.out.println(str);
        System.out.println("删除头尾空白");
        System.out.println(str.trim());
    }


    @Test
    public void testValueOf(){
        double d = 1100.00;
        boolean b = true;
        long l = 1234567890;
        char[] arr = {'w', '3', 'c', 's', 'c', 'h', 'o', 'o', 'l' };
        System.out.println("返回值:" + String.valueOf(d));
        System.out.println("返回值:" + String.valueOf(b));
        System.out.println("返回值:" + String.valueOf(l));
        System.out.println("返回值:" + String.valueOf(arr));
    }









}
